package controller

import (
	"ahutoj/web/io/constanct"
	"ahutoj/web/io/request"
	"ahutoj/web/io/response"
	"ahutoj/web/logic"
	"ahutoj/web/utils"
	"strconv"

	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"
)

// @Summary	获取公告详情
// @Description
// @Tags		Notice
// @Accept		json
// @Produce	json
// @Param		id	path		int	true	"NID"
// @Success	200	{object}	response.GetNoticeResp
// @Router		/api/notice/{id} [get]
func GetNotice(ctx *gin.Context) {
	logger := utils.GetLogInstance()
	req := new(request.GetNoticeReq)
	var err error
	req.ID, err = strconv.Atoi(ctx.Param("id"))
	if err != nil {
		logger.Errorf("call Atoi failed,req=%+v,err=%s", ctx.Param("id"), err.Error())
		response.ResponseError(ctx, constanct.InvalidParamCode)
	}
	resp, err := logic.GetNotice(ctx, req)
	if err != nil {
		logger.Errorf("call GetNotice failed,req=%+v,err=%s", utils.Sdump(req), err.Error())
		response.ResponseError(ctx, constanct.ServerErrorCode)
	}
	response.ResponseOK(ctx, resp)
}

// @Summary	获取公告列表
// @Description
// @Tags		Notice
// @Accept		json
// @Produce	json
// @Success	200	{object}	response.GetListNoticeResp
// @Router		/api/notice/notices [get]
func GetNoticeList(ctx *gin.Context) {
	logger := utils.GetLogInstance()
	// req := new(request.GetNoticeReq)
	// var err error
	// req.ID, err = strconv.Atoi(ctx.Param("id"))
	// if err != nil {
	// 	logger.Errorf("call Atoi failed,req=%+v,err=%s", ctx.Param("id"), err.Error())
	// 	response.ResponseError(ctx, constanct.InvalidParamCode)
	// }
	resp, err := logic.GetNoticeList(ctx)
	if err != nil {
		logger.Errorf("call GetNoticeList failed,err=%s", err.Error())
		response.ResponseError(ctx, constanct.ServerErrorCode)
	}
	response.ResponseOK(ctx, resp)
}

// @Summary	创建公告
// @Description
// @Tags		Notice
// @Accept		json
// @Produce	json
// @Param		CreateNoticeReq	body		request.CreateNoticeReq	true	"-"
// @Success	200				{object}	response.Response
// @Router		/api/notice/ [post]
func CreateNotice(ctx *gin.Context) {
	logger := utils.GetLogInstance()
	req := new(request.CreateNoticeReq)
	if err := ctx.ShouldBindWith(req, binding.JSON); err != nil {
		// 请求参数有误，直接返回响应
		logger.Errorf("call ShouldBindWith failed, err = %s", err.Error())
		response.ResponseError(ctx, constanct.InvalidParamCode)
		return
	}
	resp, err := logic.CreateNotice(ctx, req)
	if err != nil {
		logger.Errorf("call CreateNotice failed,req=%+v,err=%s", utils.Sdump(req), err.Error())
		response.ResponseError(ctx, constanct.ServerErrorCode)
	}
	response.ResponseOK(ctx, resp)
}

// @Summary	更新公告
// @Description
// @Tags		Notice
// @Accept		json
// @Produce	json
// @Param		id				path		int						true	"NID"
// @Param		Title			path		string					true	"Title"
// @Param		Content			body		string					true	"Content"
// @Success	200				{object}	response.Response
// @Router		/api/notice [put]]
func UpdateNotice(ctx *gin.Context) {
	logger := utils.GetLogInstance()
	req := new(request.UpdateNoticeReq)
	var err error
	req.ID, err = strconv.Atoi(ctx.Param("id"))
	if err != nil {
		logger.Errorf("call Atoi failed,param=%v, err = %s", ctx.Param("id"), err.Error())
		response.ResponseError(ctx, constanct.InvalidParamCode)
		return
	}
	if err := ctx.ShouldBindWith(req, binding.JSON); err != nil {
		// 请求参数有误，直接返回响应
		logger.Errorf("call ShouldBindWith failed, err = %s", err.Error())
		response.ResponseError(ctx, constanct.InvalidParamCode)
		return
	}
	resp, err := logic.UpdateNotice(ctx, req)
	if err != nil {
		logger.Errorf("call CheckLogin failed,req=%+v,err=%s", utils.Sdump(req), err.Error())
		response.ResponseError(ctx, constanct.ServerErrorCode)
	}
	response.ResponseOK(ctx, resp)
}

// @Summary	删除公告
// @Description
// @Tags		Notice
// @Accept		json
// @Produce	json
// @Param		id	path		int	true	"NID"
// @Success	200	{object}	response.Response
// @Router		/api/notice/{id} [delete]
func DeleteNotice(ctx *gin.Context) {
	logger := utils.GetLogInstance()
	req := new(request.DeleteNoticeReq)
	var err error
	req.ID, err = strconv.Atoi(ctx.Param("id"))
	if err != nil {
		logger.Errorf("call Atoi failed,param=%v, err = %s", ctx.Param("id"), err.Error())
		response.ResponseError(ctx, constanct.InvalidParamCode)
		return
	}
	resp, err := logic.DeleteNotice(ctx, req)
	if err != nil {
		logger.Errorf("call DeleteNotice failed,req=%+v,err=%s", utils.Sdump(req), err.Error())
		response.ResponseError(ctx, constanct.ServerErrorCode)
	}
	response.ResponseOK(ctx, resp)
}

// @Summary	获取首页图片
// @Description
// @Tags		Notice
// @Accept		json
// @Produce	json
// @Success	200	{object}	response.GetListNoticeImagesResp
// @Router		/api/notice/images [get]
func GetNoticeImages(ctx *gin.Context) {
	logger := utils.GetLogInstance()
	resp, err := logic.GetNoticeImages(ctx)
	if err != nil {
		logger.Errorf("call GetNoticeImages failed,err=%s", err.Error())
		response.ResponseError(ctx, constanct.ServerErrorCode)
	}
	response.ResponseOK(ctx, resp)
}

// @Summary	创建首页图片
// @Description
// @Tags		Notice
// @Accept		json
// @Produce	json
// @Param		file	formData	file	true	"file"
// @Success	200		{object}	response.Response
// @Router		/api/notice/images/ [post]
func CreateNoticeImage(ctx *gin.Context) {
	logger := utils.GetLogInstance()
	req := new(request.CreateNoticeImageReq)
	var err error
	// if err := ctx.ShouldBindWith(req, binding.JSON); err != nil {
	// 	// 请求参数有误，直接返回响应
	// 	logger.Errorf("call ShouldBindWith failed, err = %s", err.Error())
	// 	response.ResponseError(ctx, constanct.InvalidParamCode)
	// 	return
	// }
	req.File,err=ctx.FormFile("file")
	if err!=nil{
		logger.Errorf("call FormFile failed, err = %s", err.Error())
	}
	if !checkImageFile(req.File.Filename){
		response.ResponseError(ctx, constanct.USER_EDITIMAG_TPYECODE)
	}
	resp, err := logic.CreateNoticeImage(ctx, req)
	if err != nil {
		logger.Errorf("call CreateNoticeImage failed,err=%s", err.Error())
		response.ResponseError(ctx, constanct.ServerErrorCode)
	}
	response.ResponseOK(ctx, resp)
}

// @Summary	获取管理界面统计数据
// @Description
// @Tags		Notice
// @Accept		json
// @Produce	json
// @Success	200		{object}	response.GetDataResp
// @Router		/api/notice/data [get]
func GetData(ctx *gin.Context){
	logger := utils.GetLogInstance()
	resp, err := logic.GetData(ctx)
	if err != nil {
		logger.Errorf("call GetData failed,err=%s", err.Error())
		response.ResponseError(ctx, constanct.ServerErrorCode)
	}
	response.ResponseOK(ctx, resp)
}